package org.example;

import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Map;


//服务发现端 服务容器类 用来存储服务实例 在这里统一管理
// 实现支持多个同类服务  抽成基类 不同模块集成     换 成LinkedHashSet 保证顺序
@Service
public class ServiceContext {

    // 使用 ConcurrentHashMap 线程安全地存储服务实例
    private final ConcurrentMultimap<String, ServiceInstance> serviceMap=
            new ConcurrentMultimap<>(LinkedHashSet::new) ;


    // 注册服务 把值放进去 并更新心跳值  这里特有的
    public void registerService(ServiceInstance serviceInstance) {
        addService(serviceInstance);
        serviceInstance.setLastHeartbeat(System.currentTimeMillis());
        System.out.println("有服务注册了: " + serviceInstance);
    }



    //以下是公共的

    //添加服务
    public void addService(ServiceInstance serviceInstance) {
        serviceMap.putValue(serviceInstance.getServiceName(), serviceInstance);
    }


    // 获取服务列表 这里是set
    public Collection<ServiceInstance>  getServices(String serviceName) {
        return serviceMap.get(serviceName);
    }

    // 获取所有服务
    public ConcurrentMultimap<String, ServiceInstance> getAllServices() {
        return serviceMap;
    }



    //移除服务 从集合中移除
    public void removeServicesByServiceInstance(ServiceInstance serviceInstance) {
        String serviceName = serviceInstance.getServiceName();
        if(!serviceMap.containsKey(serviceName)){
            return;
        }
        Collection<ServiceInstance> serviceInstances = serviceMap.get(serviceName);
        serviceInstances.remove(serviceInstance);
    }


    //获取服务数量 要累加每个集合的大小
    public int getServiceCount() {
        int count = 0;
        //遍历键值对
        for (Map.Entry<String, Collection<ServiceInstance>> entry : serviceMap.entrySet()) {
            count+=entry.getValue().size();
        }
        return count;
    }


}
